docs(pm-dispatch): three measured platform readings into the readings ledger - #15955
docs(pm-dispatch): three measured platform readings into the readings ledger#15955claude[bot] wants to merge 3 commits into
Conversation
…gs ledger Three rules absent from `references/platform-readings.md`, one line each, placed in the section each belongs to: - payload-channel entry: compare each timeline array's `edges` length against `totalCount`; short means the NEWEST items are missing, so a claim check goes to the paged `get_comments` read. The existing `hasNextPage` discriminant is blind on `backTimelineItems`, whose `pageInfo` carries `hasPreviousPage` instead. - 读数陷阱: a turbo job prints `ELIFECYCLE Command failed` for many packages when one task failed; the authoritative reading is the `Failed:` line plus that package's own `##[error]`. - 读数陷阱 write-side cluster: the platform normalises blank lines around a trailing `---` rule in both directions, so a read-back comparison goes by the first differing offset, never by length. Deduplicated against the rewritten file first: the `list_issues` two-label union fact, the `added_to_merge_queue` timeline event name, and the surface- and edit-specific footer write-side behaviour are all already present and were not re-added. The file has zero headroom (359/359) and zero fold slack: none of its 333 adjacent rule pairs fits the 120-byte line cap when merged. The three lines are therefore landed measurement-first at 362 lines; the ratchet reads RED by 3 by design and the ceiling row is deliberately NOT raised here. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
|
ACCEPT, pending the ceiling ruling — lands #15647 section 1 and #15917 as ruled, measurement-first. The diff is correct and complete; what stands between it and the governed terminal is one number the maintainer owns: the readings ledger's ceiling, 359 → 362, put to him as decision card #15960 with this PR's measured count. Governed ( What the seat verified, at head
Open questions answered: Q1 → decision card #15960 (recommendation A, fallback B, with the dev's note that the Next on this PR: when #15960 is ruled, a patch round on this branch sets the ceiling row, quotes the ruling in the body, adds the Implemented-by: os-dev executor, flight #15647 section 1 + #15917, branch Generated by Claude Code |
…adings-increment-four
…uled raise The ordinary maintainer exit, taken: the ceiling for `.claude/skills/pm-dispatch/references/platform-readings.md` moves 359 -> 362 so the three measured readings this branch already carries land whole. No existing line is deleted to pay for them and no line is dropped. The raise is recorded twice, as this map's own shape prescribes: - the ceiling entry's comment stack gains the ruling, quoted verbatim and untranslated with the comment id, plus the per-reading accounting that spends the +3 exactly (payload-channel discriminant +1, the authoritative `Failed:` reading of a multi-package ELIFECYCLE spray +1, the first-differing-offset comparison +1) and the measurement that shows it could not be paid in place: zero of the file's 333 adjacent rule pairs fit the 120-byte cap when merged. - `CROSS_FILE_MOVES`' declaration for the same file gains one `ruledRaises` record, `delta: 3`, dated, quoting the same ruling. An ordinary ruled raise is the maintainer's, not the move's, so it is subtracted before the move's own raise is priced: 362 - 314 - (34 + 3) leaves the same +11 against the sources' net decrease of 11, and the map-wide total is unchanged. `was` does not move. Nothing else in the map moves. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
|
ACCEPT — contract-tier review of PR #15955, head Implemented-by: Verified in a detached compare worktree at the PR head, not from the report:
Two observations the dev noted, accepted as notes: the Next on this file: the fifth readings increment (#15977 · #16006 · #16104 section 1 · #15803 section C) needs its own lines above a ceiling that is again at headroom 0 — the seat presents that raise to the maintainer as a decision card at dispatch, the same shape as #15960, and asks in the same card whether a standing rule (each seat-verified readings increment raises the ceiling by its measured line count, recorded in Landing regime: governed ( Generated by Claude Code |
维护者速读事情:pm-dispatch 的「平台读数事实表」是各席位操作 GitHub 时的查表依据——哪个字段可信、哪个读数是静默假阴性。本 PR 加三条实测规则(一条一行),并按您今天裁的 A 把该文件的行数上限从 359 抬到 362。 三条里最重的一条:零配额通道读单卡时间线会静默丢掉最新几条评论,而认领评论按定义就是最新那条;席位据它判「没人认领」就会撞卡——已发生过一次未遂。新规则给出不依赖缓存的判别式(比较 这轮做了什么:上一轮三行顶着棘轮落地、PR 在棘轮上红 3,是为了把实测数字摆到您面前而不自行抬上限;您裁了 A,这轮只做裁决说的两件事——上限 359 → 362,并在跨文件搬运声明里补一条 要请您留意的:这个文件的余量又回到 0,而第五次读数增量(四张卡的十来条事实)已在排队。届时席位会再立一张同形的决策卡请您抬上限,并同时问一句:是否愿意定一条常设规则——每次席位核过的读数增量按实测行数抬上限、记进 席位意见:建议合并。受管面( Generated by Claude Code |
Part of #15647
Fixes #15917
Fixes #15960
Three measured platform readings were absent from the pm-dispatch readings ledger. They land here as one rule line each, placed in the section each belongs to. Two files move:
.claude/skills/pm-dispatch/references/platform-readings.md(the three lines) andscripts/pm/check-skill-line-ratchet.mjs(the ceiling the ruling below raised for them). Nothing else.The ruling this PR executes
The ledger's line ratchet is shrink-only, and its own gate row requires a raise to be a maintainer's with the ruling quoted here: 「
scripts/pm/check-skill-line-ratchet.mjs| 本文件行数只降不升(pnpm check:pm-skill-ratchet);抬上限需维护者裁决引用在 PR 正文」. That ruling was given on decision card #15960, comment5559776878, 2026-09-06 14:10Z (decision batch #56). The maintainer's reply to the batch, verbatim and untranslated:recorded as option A. The director record's own sentences for it, quoted verbatim:
Executed exactly as written: the ceiling row moves 359 → 362, one
ruledRaisesrecord is added withdelta: 3, dated, quoting the ruling.wasdoes not move, no other entry in the map moves, and the ledger file itself is not re-edited — the three lines it already carries are the deliverable.The ratchet reading, before and after
Before, at
b4a0e42— red by exactly 3, by design:After, at this head:
Headroom returns to 0, the convention every entry in the map uses.
The move arithmetic still balances, and that is the part a ruled raise could quietly have broken. This entry is also the DESTINATION of the declared cross-file move, whose
wasis the file's literal pre-move 314. An ordinary ruled raise is the maintainer's, not the move's, so it is subtracted before the move's own raise is priced — which is what the newruledRaisesrecord is for, and whywaswas not carried forward instead:The move's own raise reads +11 before and after, unchanged: the +3 lands in the ruled-raise column, not the move's. The map-wide total is still DOWN, not up.
Dedup first — every candidate grepped against the rewritten file
Section 1 of #15647 offered four facts, Addendum 2 a fifth, and #15917 a sixth. Each was grepped against the file as PR #15641 left it before anything was written:
list_issueswith twolabelsreturns their UNION, not their intersection. grep并集/求交— PRESENT at line 217, elaborated through 222. Skipped.页脚— PRESENT: line 283 carries the double-localisation and the prohibition on reading it as a law, 286 the counter-example on the same wrapper, 290 the create-versus-edit variance plus the mandatory read-back. Skipped.空行/归一/横线/长度/偏移— ABSENT. Landed.ELIFECYCLE Command failedfor many packages when one task failed. grepELIFECYCLE/turbo/Failed— ABSENT; line 252 is about adjacency not implying causality, a different fact. Landed.added_to_merge_queue, notenqueued. grepadded_to_merge_queue/enqueued— PRESENT at line 10, with line 12 already namingpull_request.enqueuedas the webhook-side name. Skipped.totalCount/get_comments/hasNextPage— PARTIAL: line 143 records the cap and line 146 the generic absence rule, but the durable discriminant, the newest-first direction and the named authoritative fallback are all absent. Landed.What landed, and one correction to the card's own wording
Three lines, each under the 120-byte cap:
totalCount; short means the newest items are missing, so a claim check goes to the pagedget_commentsread.ELIFECYCLEspray is theFailed:line plus that package's own error annotation.Correction, measured on this card while writing the line. #15917 and the dispatch both spell the payload comparison as
countagainsttotalCount. There is nocountfield. The payload block carriespageInfo,totalCountandedges, and the figure being compared is the length ofedges. The rule line is spelled that way, so a reader is not sent looking for a field that does not exist.Second measurement from the same read, on #15647 itself:
frontTimelineItemscame back with 15 edges againsttotalCount27 andhasNextPage: true, whilebackTimelineItemscame back with 0 edges against the sametotalCount27 and apageInfocarryinghasPreviousPage, nothasNextPage. So the existing line-146 discriminant is structurally blind on the tail array — the new line's "compare both arrays" is what covers it. The measurement stays here; the ledger keeps only the rule.Why the ceiling could not be paid in place
Line-neutral folding was measured, not assumed: of the ledger's 333 adjacent rule pairs, zero fit the 120-byte line cap when merged, so there is no re-wrap slack at all — and re-wrap is in any case not legal currency for buying lines (the 2026-08-17 rule). Nothing was deleted to pay, per the ruling. The +3 is accounted for line by line beside the ceiling entry itself: payload-channel discriminant +1, the authoritative
Failed:reading +1, the first-differing-offset comparison +1.Serial constraint against flight B — proven, not assumed
Flight B's PR #16357 (
f5c08e9589) edits the same map, at the row-bytes pin table. This PR touches the ceiling table and theruledRaiseslist only. Merge-tree proof at this head, run twice — once as this clone is configured, and once with the repo's custom merge driver disabled, because this repo registersmerge=os-regenper clone and a driver's exit 0 means "the driver took it", not "no conflict", while the server has no driver registered:Both produce the identical tree
867c5e239f, so the two readings agree rather than merely both being green.origin/main(f377394ae2) was merged into this branch as a merge commit — no rebase, no amend, no force-push. After the merge the branch's own diff againstorigin/mainis exactly the three ledger lines plus this ceiling change, and nothing else.Verification
At commit
04b61b5f6a, the final head; every figure below read from that tree, and every exit captured BEFORE any pipe.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 38 families from the real change set (the script derives it itself from the merge base — 2 committed paths, 0 working-tree, 0 untracked). All 38 were run;--ranreconciles:✓ dispatch-gates --ran: 38 derived famil(ies) accounted for — 38 run, 0 NOT-MEASURED.pnpm --filter @objectstack/lint run check:doc-formula-expressions, exited 3 — PREREQUISITE NOT MET, which measures nothing; afterturbo run build --filter=@objectstack/formula --filter=@objectstack/lintit exits 0. Recorded as a re-run, not as a failure.node scripts/pm/check-skill-line-ratchet.mjs --self-test— 155 cases pass; the live run is the green quoted above, with zero red lines. One advisory prints, and it is not this diff's: it names.claude/skills/spec-property-retirement/SKILL.md's row-bytes pin, whose file and whose pin row are both byte-identical toorigin/mainin this branch — it is the pin flight B is paying down.node scripts/pm/check-skill-id-lint.mjs(self-test + live) — green. The scanned corpus is the pm-dispatch markdown tree,.claude/agents/os-dev.mdandAGENTS.md; the ruling citations added here live in the.mjs, which is deliberately outside it.node scripts/pm/check-half-states.mjs --self-test— 2,553 cases pass.node scripts/pm/check-governed-merges.mjs --teston the real two-path file list exits 3 — GOVERNED, on.claude/**. This PR stays a draft; no seat flips it ready, enqueues it, or arms auto-merge.pnpm check:nul-bytes— green (75 self-test assertions; 8,030 text files scanned, no raw ASCII control bytes), plus a direct scan of both changed files for the wider control-character class: 0 hits.pnpm lint(eslint . --no-inline-config, full population, no narrowing) throughscripts/pm/os-verify-lock.shslotissue-15647:VERDICT command-exit 0 · held the lock 104s. Shared-box seconds, as the wrapper itself states.维护者速读(草稿)
这是什么。 pm-dispatch 的「平台读数事实表」是 PM 与 dev 席位在操作 GitHub 时的查表依据 —— 哪个字段可信、哪个读数是静默假阴性、配额往哪走。本 PR 往里加三条实测规则,一条一行;并按您 09-06 的裁决把该文件的行数上限从 359 抬到 362,好让这三行完整落地。
为什么值得改。 三条里最重的一条是认领读数:零配额通道读单卡时间线会静默丢掉最新的几条评论,而认领评论按定义就是最新那条。席位据它判「这张卡没人认领」,就会重复认领、两个 agent 撞在同一张卡上 —— 已经发生过一次未遂。新规则给出一个不依赖缓存行为的判别式,并点名权威回退读法。另两条分别防「把陪葬包读成故障源」和「两段不同的正文因长度相等被判相同」。
这轮做了什么。 上一轮把三行顶着棘轮落地、PR 在棘轮上红 3,是为了把实测数字摆到您面前,不自行抬上限。您裁了 A,这轮就只做裁决说的两件事:上限行 359 改 362,并在跨文件搬运声明里补一条
+3的「已裁提额」记录,把它与搬运自己的额度分开记账。事实表本身一个字没再动,也没有为了变绿删掉任何既有内容。代价是什么。 事实表多 3 行,棘轮回到 0 余量。该文件确实一条折行余量都没有:333 对相邻规则行里,合并后能塞进 120 字节上限的是 0 对 —— 这是实测,不是估计。全表总额仍是净下降 9 行,没有因这次提额而增长。
风险面。 纯文档 + 一处门禁常量,零运行时影响,零发布面;
.claude/**属受管面,按规矩人工合并。回滚 = revert 两个 commit。与并行的 PR #16357 改同一个文件的不同段落,已用 merge-tree 双向证过无冲突。席位意见:
Generated by Claude Code
Generated by Claude Code